﻿namespace myForthCSharp
{
    internal class Program
    {   /// <summary>
        /// write a calendar
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            //需要的变量，日历的长度8，宽度35，表示光标的位置，记录一号星期的，记录每天星期（用来表示x的位置），
            const int monthWidth = 35;
            const int monthHeight = 8;
            int x = 0, y = 0;
            //1号记录
            int theDayOfFirstDay = 0;
            //每个星期几
            int theDate = 0;
            //每一天的值
            DateTime atDay;
            for (atDay = new DateTime(2022, 1, 1); atDay.Year == 2022; atDay = atDay.AddDays(1))
            {   //每月开始时作用一次
                if (atDay.Day == 1)
                {
                    //先打出月份
                    x = 6 + (atDay.Month - 1) % 3 * monthWidth;
                    y = ((atDay.Month - 1) / 3) * monthHeight;
                    Console.SetCursorPosition(x, y);
                    Console.Write("{0}月", atDay.Month);
                    //打出星期
                    Console.SetCursorPosition(x, y + 1);
                    Console.Write("日  一  二  三  四  五  六");
                    //记录1号是星期几，对y的坐标有巨大影响
                    theDayOfFirstDay = Convert.ToInt32(atDay.DayOfWeek);
                }
                //每天是星期几可以用来设置x的位置
                theDate = Convert.ToInt32(atDay.DayOfWeek);
                //y+1将光标放到了'日  一  二  三  四  五  六'，atDay.Day - 1代表天数的差值，theDayOfFirstDay最开始的空格数，加起来就是总占的空格数
                //还要再加1才能到输入日期列中。在设置光标过程里，要注意y+1后并没有改变y
                Console.SetCursorPosition(x + theDate * 4, y + 1 + ((theDayOfFirstDay + atDay.Day - 1) / 7 + 1));
                Console.Write(atDay.Day);




            }
        }
    }
}